/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.deployment.dao;

import br.com.deployment.daogenerico.DaoGenerico;
import br.com.deployment.entidade.protocolo.Lancamento;
import br.com.deployment.entidade.protocolo.Pagamento;
import br.com.deployment.entidade.protocolo.Protocolo;
import br.com.deployment.interfaces.LancamentoDaoIn;
import br.com.deployment.utilitario.Msg;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.Query;

/**
 *
 * @author luciano
 */
@Stateless
@LocalBean
public class LancamentoDao extends DaoGenerico<Lancamento> implements LancamentoDaoIn{

    public LancamentoDao() {
        super(Lancamento.class);
    }

    public List<Protocolo> findProtocolos(Lancamento lancamento) throws Exception {
        if (lancamento == null || lancamento.getDataLanc() == null) {
            throw new Exception();
        }
        List<Protocolo> protocolos = null;
        try {
            String sql = "Select p from Protocolo p where p.dataCad=:data";
            Query query = getEm().createQuery(sql);
            query.setParameter("data", lancamento.getDataLanc());
            protocolos = query.getResultList();
        } catch (Exception e) {
            Msg.messagemError("Erro ao buscar protocolos.");
        }
        return protocolos;
    }
    
    public List<Lancamento> findAll(){
        String sql = "select l from Lancamento l";
        Query query = getEm().createQuery(sql);
        return query.getResultList();
    }
    
    public BigDecimal totalAreceber(Date date){
        String sql = "select SUM(pa.valorAPagar) from Protocolo p JOIN p.parcelas pa where "
                + "p.dataCad=:data AND pa.ativo=TRUE";
        Query query = getEm().createQuery(sql);
        query.setParameter("data", date);
        BigDecimal total = (BigDecimal) query.getSingleResult();
        return total;
    }
    
    public BigDecimal totalRecebido(Date date){
        String sql = "select SUM(pa.valorPago) from Protocolo p JOIN p.parcelas pa "
                + " where p.dataCad=:data AND pa.ativo=false";
        Query query = getEm().createQuery(sql);
        query.setParameter("data", date);
        BigDecimal total = (BigDecimal)query.getSingleResult();
        System.err.println(" -- "+ total);
        return total;
    }
    
    public boolean existe(Lancamento lancamento){
        String sql = "select COUNT(l) from Lancamento l where l.dataLanc=:data AND l.prestador.id=:id";
        Query query = getEm().createQuery(sql);
        query.setParameter("data", lancamento.getDataLanc());
        query.setParameter("id", lancamento.getPrestador().getId());
        Long total = (Long)query.getSingleResult();
        return total.intValue() > 0;
    }
    
    public List<Lancamento> buscarLancamento(Lancamento lancamento){
        String sql = "select l from Lancamento l where";
        if(lancamento.getPrestador() != null && lancamento.getPrestador().getId() != 0){
            sql += " l.prestador.id=:id AND"; 
        }
        if(lancamento.getDataLanc() != null){
            sql += " l.dataLanc=:data AND"; 
        }
        sql +=" 1=1";
        Query query = getEm().createQuery(sql);
        
        if(lancamento.getPrestador() != null && lancamento.getPrestador().getId() != 0){
            query.setParameter("id", lancamento.getPrestador().getId());
        }
        if(lancamento.getDataLanc() != null){
            query.setParameter("data", lancamento.getDataLanc());
        }
        
        List<Lancamento> resp = query.getResultList();
        
        return resp; 
        
    }
    
    
    public List<Pagamento> findPagamentos(Lancamento lancamento) throws Exception {
        if (lancamento == null || lancamento.getDataLanc() == null) {
            throw new Exception();
        }
        List<Pagamento> pagamentos = null;
        try {
            String sql = "Select p from Pagamento p where p.dataPag=:data";
            Query query = getEm().createQuery(sql);
            query.setParameter("data", lancamento.getDataLanc());

            pagamentos = query.getResultList();
        } catch (Exception e) {
            Msg.messagemError("Erro ao buscar pagamentos.");
        }
        return pagamentos;
    }
}